package com.linser.gistools.utils;

import com.linser.gistools.refactoring.geotools.JMapPaneNew;
import com.linser.gistools.refactoring.javafx.treeitem.CrsTreeItem;
import javafx.concurrent.Task;
import javafx.scene.image.Image;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import org.geotools.map.MapContent;
import org.geotools.referencing.CRS;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.crs.GeographicCRS;
import org.opengis.referencing.crs.ProjectedCRS;

import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

public class GlobalVariables {
    public static JMapPaneNew jMapPane;
    //地图面板
    public static MapContent mapContent ;

    //地图容器（拖放图层时用到）
    public static StackPane mapPaneContainer ;
    //主窗体
    public static Stage mainStage;
    //主包路径
    public static String mainPackageName;

    //全局logo
    public static Image logoIcon;

    public static Properties commonConfigProperties;

    //坐标系存储对象
    public static Map<String, CrsTreeItem> crsTypeMap = new ConcurrentHashMap<>();

    public static void initPreLoadData(){

        Task<Void> task = new Task<Void>() {
            @Override
            protected Void call() throws FactoryException {
                // 在此处处理数据
                // 这部分代码会在后台线程中执行
                CrsTreeItem geographicNode = new CrsTreeItem("地理坐标系");
                CrsTreeItem projectedNode = new CrsTreeItem("投影坐标系");
                // 获取所有支持的坐标系
                Set<String> crsAuthorities = new CapabilitiesCRSProvider().getCodes();

                // 遍历所有支持的地理坐标系
                for (String code : crsAuthorities) {
                    try {
                        // 根据 authority 和 code 获取 CoordinateReferenceSystem
                        CoordinateReferenceSystem crs = CRS.decode(code);
                        if (crs instanceof GeographicCRS) {
                            geographicNode.getChildren().add(new CrsTreeItem(crs));
                            //allGeographicCRS.add(crs);
                        }else if (crs instanceof ProjectedCRS) {
                            projectedNode.getChildren().add(new CrsTreeItem(crs));
                            //allProjectedCRS.add(crs);
                        }
                    } catch (Exception e) {
                        System.err.println("Error decoding CRS: " + code);
                    }
                }
                crsTypeMap.put("地理坐标系",geographicNode);
                crsTypeMap.put("投影坐标系",projectedNode);
                // 处理完成后，如果需要更新 UI，则可以使用 updateMessage()、updateProgress() 等方法来更新 Task 的状态，
                // 或者通过 succeeded()、failed() 方法来处理任务完成的事件
                return null;
            }
        };

        task.setOnSucceeded(event -> {
            // 处理任务成功完成后，在此处更新 UI
        });

        task.setOnFailed(event -> {
            // 处理任务失败后，在此处更新 UI 或处理其他逻辑
        });
        // 启动任务
        new Thread(task).start();
    }

}
